import pygame
from pygame.locals import *
from sys import exit
import os

def jogo():
    tela_largura, tela_altura = 800, 600

    clock = pygame.time.Clock()

    tela = pygame.display.set_mode((tela_largura, tela_altura), 0, 32)
    pygame.display.set_caption("ArkPythonoid")

    # Carrega a musica no jogo
    pygame.mixer.music.load("sons" + os.sep + "musica0.mp3")
    pygame.mixer.music.play(-1)
    tocando = True
    pressiona_p = False

    # Carrega os sons
    som_colisao = pygame.mixer.Sound("sons" + os.sep + "tabela.wav")
    som_colisao.set_volume(4.0)
    
    # carrega o plano de fundo
    plano_fundo = pygame.image.load("figuras" + os.sep + "planofundo0.jpg").convert()

    #variaveis dos blocos
    imagem_bloco = pygame.image.load("figuras" + os.sep + "bat.png").convert_alpha()
    bloco_largura, bloco_altura = imagem_bloco.get_size()
    bloco_posicao = []
    for x in range(10):
        for y in range(9):
            bloco_posicao.append(((x * bloco_largura) + 100, (y * bloco_altura) + 100))
    c_bloco_posicao = bloco_posicao[::]

    # Variaveis do bouncer
    imagem_bouncer = pygame.image.load('figuras' + os.sep + "bouncer.png").convert_alpha()
    bouncer_largura, bouncer_altura = imagem_bouncer.get_size()
    bouncer_x, bouncer_y = (tela_largura/2 - bouncer_largura/2), (tela_altura - bouncer_altura)

    # Variaveis da bola
    imagem_bola = pygame.image.load('figuras' + os.sep + "ball.png").convert_alpha()
    bola_largura, bola_altura = imagem_bola.get_size()
    bola_x, bola_y = (tela_largura/2 - bola_altura/2), (tela_altura - bouncer_altura - bola_altura - 1)
    posicao_inicial = (bola_x, bola_y)
    bola_variax = 0
    bola_variay = 0
    varia_negativo = -5
    varia_positivo = 5

    # Variaveis verdeu e ganhou
    imagem_ganhou = pygame.image.load('figuras' + os.sep + "ganhou.png").convert_alpha()
    ganhou_x, ganhou_y = (270, 200)

    imagem_perdeu = pygame.image.load('figuras' + os.sep + "perdeu.png").convert_alpha()
    perdeu_x, perdeu_y = (270, 200)

    chance = 3
    estagio = 1

    while True:
        clock.tick(60)
        for evento in pygame.event.get():
            if evento.type == QUIT:
                exit()

            if evento.type == KEYDOWN:
                if evento.key == K_ESCAPE:
                    if tocando:
                        pygame.mixer.music.pause()
                        tocando = False
                    return 

        pressiona_tecla = pygame.key.get_pressed()
        
        # Verifica colisao com a tela
        if bola_x <= 0:
            bola_variax = varia_positivo
            som_colisao.play()

        if bola_x + bola_largura >= tela_largura:
            bola_variax = varia_negativo
            som_colisao.play()

        if bola_y <= 0:
            bola_variay = -bola_variay
            som_colisao.play()

        if bola_y + bola_altura >= tela_altura:
            bola_x, bola_y = posicao_inicial[0], posicao_inicial[1]
            bola_variax = 0
            bola_variay = 0
            bouncer_x, bouncer_y = (tela_largura/2 - bouncer_largura/2), (tela_altura - bouncer_altura)
            chance -= 1
        # Verifica colisao com o bouncer
        if bola_y + bola_altura >= bouncer_y:
            if bouncer_x <= bola_x <= bouncer_x + bouncer_largura:
                bola_variay = varia_negativo
                som_colisao.play()
                if bola_x + bola_largura >= bouncer_x + bouncer_largura >= bola_x and bola_variax < 0:
                    bola_variax = varia_positivo

            elif bouncer_x <= bola_x + bola_largura <= bouncer_x + bouncer_largura:
                bola_variay = varia_negativo
                som_colisao.play()
                if bola_x + bola_largura >= bouncer_x >= bola_x and bola_variax > 0:
                    bola_variax = varia_negativo

        # Verifica colisao com os blocos
        bloco_posicao = c_bloco_posicao[::]
        for posicao in bloco_posicao:
            if bola_y <= posicao[1] + bloco_altura and bola_y + bola_altura >= posicao[1]:
                if  bola_x + bola_largura >= posicao[0] and bola_x <= posicao[0] + bloco_largura:
                    if bola_y <= posicao[1] + bloco_altura <= bola_y + bola_altura and bola_variay < 0:
                        bola_variay = varia_positivo
                    elif bola_y <= posicao[1] <= bola_y + bola_largura and bola_variay > 0:
                        bola_variay = varia_negativo
                    som_colisao.play()
                    c_bloco_posicao.remove(posicao)
                    if bola_x <= posicao[0] <= bola_x + bola_largura and bola_variax > 0:
                        bola_variax = varia_negativo
                    elif bola_x <= posicao[0] + bloco_largura <= bola_x + bola_largura and bola_variax < 0:
                        bola_variax = varia_positivo

        # verifica o termino da fase
        if len(bloco_posicao) == 0:
            if estagio == 1:
                bola_variax = 0
                bola_variay = 0
                bouncer_x, bouncer_y = (tela_largura/2 - bouncer_largura/2), (tela_altura - bouncer_altura)
                bola_x, bola_y = (tela_largura/2 - bola_altura/2), (tela_altura - bouncer_altura - bola_altura - 1)
                varia_negativo = -6
                varia_positivo = 6
                for x in range(6):
                    for y in range(18):
                        if x < 3:
                            c_bloco_posicao.append(((x * bloco_largura) + 100, (y * bloco_altura) + 50))
                        else:
                            c_bloco_posicao.append(((x * bloco_largura) + 400, (y * bloco_altura) + 50))
                        
            if estagio == 2:
                if tocando:
                    pygame.mixer.music.pause()
                    tocando = False
                x = 0
                while x <= 3:
                    tela.blit(imagem_ganhou, (ganhou_x, ganhou_y))
                    pygame.display.flip()
                    x += 1
                    clock.tick(1)
                return

            estagio += 1

        # verifica se acabou as tentativas
        if chance <= 0:
            if tocando:
                pygame.mixer.music.pause()
                tocando = False
            x = 0
            while x <= 3:
                tela.blit(imagem_perdeu, (perdeu_x, perdeu_y))
                pygame.display.flip()
                x += 1
                clock.tick(1)
            return

        # Movimenta a bola
        bola_x += bola_variax
        bola_y += bola_variay

        # Movimenta o bouncer
        if pressiona_tecla[K_SPACE] and bola_variax == 0 and bola_variay == 0:
            bola_variax = varia_negativo
            bola_variay = varia_negativo
        if pressiona_tecla[K_LEFT] and bouncer_x > 0:
            bouncer_x -= 9
            if bola_variay == 0 and bola_variax == 0:
                bola_x -= 9
        if pressiona_tecla[K_RIGHT] and bouncer_x + bouncer_largura < tela_largura:
            bouncer_x += 9
            if bola_variay == 0 and bola_variax == 0:
                bola_x += 9
        if pressiona_tecla[K_p] and not pressiona_p:
            pressiona_p = True
            if tocando:
                pygame.mixer.music.pause()
                tocando = False
            else:
                pygame.mixer.music.unpause()
                tocando = True
        elif pressiona_p and not pressiona_tecla[K_p]:
            pressiona_p = False
            

        tela.blit(plano_fundo, (0,0))
        tela.blit(imagem_bouncer, (bouncer_x, bouncer_y))
        tela.blit(imagem_bola, (bola_x, bola_y))
        for posicao in bloco_posicao:
            tela.blit(imagem_bloco, posicao)
        pygame.display.flip()


def instrucoes():
    
    tela_largura, tela_altura = 800, 600
    tela = pygame.display.set_mode((tela_largura, tela_altura), 0, 32)
    pygame.display.set_caption("ArkPythonoid")
    
    plano_fundo = pygame.image.load("figuras" + os.sep + "instrucoes.jpg").convert()

    botoes_retorna = [pygame.image.load("figuras" + os.sep + "retornar" + str(num) + ".jpg").convert() for num in xrange(3)]
    botao_retorna = botoes_retorna[0]
    retorna_tamanho = botao_retorna.get_size()
    retorna_posicao = (10, 10)

    pressionado = False
    
    while True:
        for evento in pygame.event.get():
            if evento.type == QUIT:
                exit()
            if evento.type == KEYDOWN:
                if evento.key == K_ESCAPE:
                    return
					

            posicao_mouse = pygame.mouse.get_pos()
            pressiona_mouse = pygame.mouse.get_pressed()
            		
            if retorna_posicao[0] <= posicao_mouse[0] <= retorna_posicao[0] + retorna_tamanho[0] and retorna_posicao[1] <= posicao_mouse[1] <= retorna_posicao[1] + retorna_tamanho[1]:
                botao_retorna = botoes_retorna[1]

                if pressiona_mouse[0]:
                    botao_retorna = botoes_retorna[2]
                    pressionado = True
                            
                if pressionado and not pressiona_mouse[0]:
                    botao_retorna = botoes_retorna[1]
                    return

            else:
                botao_retorna = botoes_retorna[0]

            tela.blit(plano_fundo, (0,0))
            tela.blit(botao_retorna, retorna_posicao)
            pygame.display.flip()

def creditos():

    tela_largura, tela_altura = 800, 600
    tela = pygame.display.set_mode((tela_largura, tela_altura), 0, 32)
    pygame.display.set_caption("ArkPythonoid")
    
    plano_fundo = pygame.image.load("figuras" + os.sep + "creditos.jpg").convert()

    botoes_retorna = [pygame.image.load("figuras" + os.sep + "retornar" + str(num) + ".jpg").convert() for num in xrange(3)]
    botao_retorna = botoes_retorna[0]
    retorna_tamanho = botao_retorna.get_size()
    retorna_posicao = (10, 10)

    pressionado = False
    
    while True:
        for evento in pygame.event.get():
            if evento.type == QUIT:
                exit()
            if evento.type == KEYDOWN:
                if evento.key == K_ESCAPE:
                    return


            posicao_mouse = pygame.mouse.get_pos()
            pressiona_mouse = pygame.mouse.get_pressed()
            		
            if retorna_posicao[0] <= posicao_mouse[0] <= retorna_posicao[0] + retorna_tamanho[0] and retorna_posicao[1] <= posicao_mouse[1] <= retorna_posicao[1] + retorna_tamanho[1]:
                botao_retorna = botoes_retorna[1]

                if pressiona_mouse[0]:
                    botao_retorna = botoes_retorna[2]
                    pressionado = True
                            
                if pressionado and not pressiona_mouse[0]:
                    botao_retorna = botoes_retorna[1]
                    return

            else:
                botao_retorna = botoes_retorna[0]

            tela.blit(plano_fundo, (0,0))
            tela.blit(botao_retorna, retorna_posicao)
            pygame.display.flip()

tela_largura, tela_altura = 800, 600

pygame.init()

tela = pygame.display.set_mode((tela_largura, tela_altura), 0, 32)
pygame.display.set_caption("ArkPythonoid")

botoes_iniciar = [pygame.image.load("figuras" + os.sep + "iniciar" + str(num) + ".png").convert_alpha() for num in xrange(3)]
botao_iniciar = botoes_iniciar[0]
iniciar_tamanho = botao_iniciar.get_size()
iniciar_posicao = (280, 2)

botoes_sair = [pygame.image.load("figuras" + os.sep + "sair" + str(num) + ".png").convert_alpha() for num in xrange(3)]
botao_sair = botoes_sair[0]
sair_tamanho = botao_sair.get_size()
sair_posicao = (280, 180)

botoes_instrucao = [pygame.image.load("figuras" + os.sep + "instrucao" + str(num) + ".png").convert_alpha() for num in xrange(3)]
botao_instrucao = botoes_instrucao[0]
instrucao_tamanho = botao_instrucao.get_size()
instrucao_posicao = (260, 50)

botoes_credito = [pygame.image.load("figuras" + os.sep + "credito" + str(num) + ".png").convert_alpha() for num in xrange(3)]
botao_credito = botoes_credito[0]
credito_tamanho = botao_credito.get_size()
credito_posicao = (280, 120)

plano_fundo = pygame.image.load("figuras" + os.sep + "menu.jpg").convert()

pressionado = False

while True:
    for evento in pygame.event.get():
        if evento.type == QUIT:
            exit()

        posicao_mouse = pygame.mouse.get_pos()
        pressiona_mouse = pygame.mouse.get_pressed()
            
        if iniciar_posicao[0] <= posicao_mouse[0] <= iniciar_posicao[0] + iniciar_tamanho[0] and iniciar_posicao[1] <= posicao_mouse[1] <= iniciar_posicao[1] + iniciar_tamanho[1]:
            botao_iniciar = botoes_iniciar[1]

            if pressiona_mouse[0]:
                botao_iniciar = botoes_iniciar[2]
                pressionado = True
                            
            if pressionado and not pressiona_mouse[0]:
                    botao_iniciar = botoes_iniciar[1]
                    jogo()

        else:
            botao_iniciar = botoes_iniciar[0]


        if sair_posicao[0] <= posicao_mouse[0] <= sair_posicao[0] + sair_tamanho[0] and sair_posicao[1] <= posicao_mouse[1] <= sair_posicao[1] + sair_tamanho[1]:
            botao_sair = botoes_sair[1]

            if pressiona_mouse[0]:
                botao_sair = botoes_sair[2]
                pressionado = True

            if pressionado and not pressiona_mouse[0]:
                botao_sair = botoes_sair[1]
                exit()

        else: botao_sair = botoes_sair[0]


        if instrucao_posicao[0] <= posicao_mouse[0] <= instrucao_posicao[0] + instrucao_tamanho[0] and instrucao_posicao[1] <= posicao_mouse[1] <= instrucao_posicao[1] + instrucao_tamanho[1]:
            botao_instrucao = botoes_instrucao[1]

            if pressiona_mouse[0]:
                botao_instrucao = botoes_instrucao[2]
                pressionado = True
                            
            if pressionado and not pressiona_mouse[0]:
                    botao_instrucao = botoes_instrucao[1]
                    instrucoes()

        else:
            botao_instrucao = botoes_instrucao[0]


        if credito_posicao[0] <= posicao_mouse[0] <= credito_posicao[0] + credito_tamanho[0] and credito_posicao[1] <= posicao_mouse[1] <= credito_posicao[1] + credito_tamanho[1]:
            botao_credito = botoes_credito[1]

            if pressiona_mouse[0]:
                botao_credito = botoes_credito[2]
                pressionado = True
                            
            if pressionado and not pressiona_mouse[0]:
                    botao_credito = botoes_credito[1]
                    creditos()

        else:
            botao_credito = botoes_credito[0]


        if not pressiona_mouse[0]:
            pressionado = False

        tela.blit(plano_fundo, (0,0))

        tela.blit(botao_instrucao, instrucao_posicao)
        tela.blit(botao_credito, credito_posicao)
        tela.blit(botao_sair, sair_posicao)
        tela.blit(botao_iniciar, iniciar_posicao)

        pygame.display.flip()
